/**
 * 2. 两数相加
 * https://leetcode-cn.com/problems/add-two-numbers/
 */
public class Solutions_2 {
    public static void main(String[] args) {
        ListNode l1 = new ListNode(2);
        l1.next = new ListNode(4);
        l1.next.next = new ListNode(3);

        ListNode l2 = new ListNode(5);
        l2.next = new ListNode(6);
        l2.next.next = new ListNode(4);

        ListNode result = addTwoNumbers(l1, l2);
        String resultStr = MyLinkedListUtils.ListNodeToString(result);
        System.out.println(resultStr);
    }

    /**
     * 迭代实现
     */
    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int carry = 0;
        // 创建结果链表
        ListNode res = new ListNode(-1);
        // 变化的尾结点
        ListNode cur = res;

        /**
         * 三个条件都不满足时，退出循环
         */
        while (l1 != null || l2 != null || carry > 0) {
            if (l1 != null) {
                // 当前结点的值
                carry += l1.val;
                l1 = l1.next;
            }
            if (l2 != null) {
                // 当前结点的值
                carry += l2.val;
                l2 = l2.next;
            }
            // 大于等于 10 时，仅记录余数
            cur.next = new ListNode(carry % 10);
            // 总是指向尾结点
            cur = cur.next;
            // 记录进位
            carry = carry / 10;
        }
        return res.next;
    }
}
